<?php

/**
 * Textos
 * 
 * @author Diego Pessoa
 * @version 1.5
 * 
 */

require_once 'Zend/Db/Table/Abstract.php';

class Textos extends Zend_Db_Table_Abstract {
	
	/** Nome da tabela no banco
	 * 
	 * @var string 
	 */
	protected $_name = 'tex_textos';
	
	/** Classes Dependentes
	 *  
  	 * @var array
	 */
	protected $_dependentTables = array ('Lacunas', 'Recursos', 'Perguntas' );
	
	/** Classes Referenciadas
	 * 
	 * @var array 
	 */
	protected $_referenceMap = array (
	'Usuario' => array ('columns' => 'id_usuario', 
						'refTableClass' => 'Usuarios', 
						'refColumns' => 'id' ),
	'Grupo' => 	array('columns' => 'id_grupo',
					  'refTableClass' => 'Grupos',
					  'refColumns' => 'id')
	 );
	
	/**
	 * Faz uma busca de textos baseada numa palavra-chave, �rea ou usu�rio
	 * 
	 * @param 
	 * @return Texto
	 */
	public function search($busca, $area = '0', $usuario = '', $ordem = 'data desc') {
		$textos = array ( );
		
		$select = $this->getAdapter ()->select ()->from ( array ('tag' => 'tex_tags_textos', array ('tag.id_texto' ) ) )->join ( array ('t' => 'tex_textos' ), 't.id = tag.id_texto' )->where ( "tag.tag LIKE ? OR t.titulo LIKE ?", "%$busca%" );
		if ($area != 0) {
			$select->join ( array ('area_texto' => 'tex_areas_textos' ), 'area_texto.id_texto = t.id' )->join ( array ('a' => 'tex_areas' ), 'area_texto.id_area = a.id' )->where ( "a.id = ?", $area );
		}
		$select->group('t.id');
		
		$resultados = $this->getAdapter ()->fetchAll ( $select );
		
		foreach ( $resultados as $r ) {
			
			$condicao = $this->getAdapter ()->quoteInto ( "id = ?", $r ['id_texto'] );
			
			if ($usuario)
				$condicao .= " and " . $this->getAdapter ()->quoteInto ( "id_usuario = ?", $usuario );
			
			$item = $this->fetchAll ( $condicao, $ordem )->current ();
			$textos [] = $item;
		
		}
		return $textos;
	}
	
	/**
	 * Insere o texto no banco
	 * 
	 * @param array dados
	 */
	public function insert(array $dados) {
		
		$areas = $dados ['areas'];
		$tags = explode ( ",", $dados ['tags'] );
		
		unset ( $dados ['areas'] );
		unset ( $dados ['tags'] );
		
		parent::insert ( $dados );
		
		$id_texto = $this->getAdapter ()->lastInsertId ();
		
		/* inserindo as �reas de conhecimento correspondentes */
		foreach ( $areas as $a ) {
			$areasTextos = new AreasTextos ( );
			$areasTextos->insert ( array ('id_area' => $a, 'id_texto' => $id_texto ) );
		}
		
		/* inserindo as tags correspondentes */
		foreach ( $tags as $t ) {
			$tags = new TagsTextos ( );
			$tags->insert ( array ('tag' => $t, 'id_texto' => $id_texto ) );
		}
		return $id_texto;
	}
	
	/**
	 * Atualiza o texto no banco
	 * 
	 * @param array dados, string where
	 */
	public function update(array $dados, $where) {
		
		$areasTextosDAO = new AreasTextos ( );
		$tagsTextosDAO = new TagsTextos ( );
		
		$texto = $this->find ( $dados ['id'] )->current ();
		$id_texto = $texto->id;
		
		$areasForm = $dados ['areas'];
		$areasBanco = array ( );
		foreach ( $texto->findAreasViaAreasTextosByTexto () as $area )
			$areasBanco [] = $area->id;
			
		/* Se a �rea que est� no banco n�o estiver mais selecionada no formul�rio, � deletada no banco */
		foreach ( $areasBanco as $a )
			if (! in_array ( $a, $areasForm )) {
				print $texto->id;
				$areasTextosDAO->delete ( "id_area = " . $this->getAdapter ()->quote ( $a ) . " and id_texto = " . $this->getAdapter ()->quote ( $id_texto ) );
			}
			
		/* Se a �reas do formul�rio n�o estiverem no banco, s�o inseridas */
		foreach ( $areasForm as $a )
			if (! in_array ( $a, $areasBanco ))
				$areasTextosDAO->insert ( array ('id_area' => $a, 'id_texto' => $texto->id ) );
		
		$tagsForm = explode ( ",", $dados ['tags'] );
		$tagsBanco = array ( );
		foreach ( $texto->findTagsTextosByTexto () as $tag )
			$tagsBanco [] = $tag->tag;
			
		/* Se a tag que est� no banco n�o estiver mais selecionada no formul�rio, � deletada no banco */
		foreach ( $tagsBanco as $t )
			if (! in_array ( $t, $tagsForm ))
				$tagsTextosDAO->delete ( "tag = " . $this->getAdapter ()->quote ( $t ) . " and id_texto = " . $this->getAdapter ()->quote ( $id_texto ) );
			
		/* Se a tag do formul�rio n�o estiverem no banco, s�o inseridas */
		foreach ( $tagsForm as $t )
			if (! in_array ( $t, $tagsBanco ))
				$tagsTextosDAO->insert ( array ('tag' => $t, 'id_texto' => $texto->id ) );
		
		unset ( $dados ['areas'] );
		unset ( $dados ['tags'] );
		
		parent::update ( $dados, $where );
	
	}
	
	/**
	 * Deleta o texto do banco
	 * 
	 * @param int id
	 */
	public function delete($id) {
		parent::delete ( $this->getAdapter ()->quoteInto ( "id = ?", $id ) );
	}
	
	/**
	 * Pega todos os textos
	 * 
	 * @param string ordem
	 * @return array
	 */
	public function findAll($ordem = '') {
		return $this->fetchAll ( null, $ordem );
	}
	
	public function findByFiltro($filtro, $ordem) {
		return $this->fetchAll ( $this->select()->order($filtro.' '.$ordem));
	}
	public function findAllByTitulo() {
		return $this->fetchAll ( $this->select()->order('titulo asc'));
	}
	
	/**
	 * Pega um texto pelo usu�rio
	 * @param int id, string ordem
	 * @return Texto
	 */
	public function findByUsuario($id, $filtro, $ordem ) {
		return  $this->fetchAll($this->select()->where($this->getAdapter ()->quoteInto ( 'id_usuario = ?', $id))->order($filtro.' '.$ordem));

	}
	
	 /**
	  * Verifica se o texto possui o recurso
	  * 
	  * @param int recurso int recurso
	  * @return boolean
	  */
	public function hasRecurso($recurso, $texto) {
		$recursoDAO = new Recursos();
		$recursoExistente = $recursoDAO->findByRecursoAndTexto($recurso, $texto)->current();
		if ($recursoExistente)
			return true;
		return false;
	}
	
	/**
	  * Verifica se o texto possui a �rea
	  * 
	  * @param int area
	  * @return boolean
	  */
	public function hasArea($area) {
		$areasTextos = new AreasTextos();
		$areaExistente = $areasTextos->findbyAreaAndTexto($area->id, $this->id)->current();
		if (count($areaExistente) > 0)
			return true;
		return false;
	}
	
	
	
}
